package controller;

import dao.ConteudoDaEmentaJpaController;
import dao.ConteudoJpaController;
import dao.PlanoJpaController;
import dao.TurmaJpaController;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import dao.exceptions.NonexistentEntityException;
import java.util.ArrayList;
import model.Aluno;
import model.Conteudo;
import model.ConteudoDaEmenta;
import model.Disciplina;
import model.DisciplinaProfessor;
import model.Ementa;
import model.Matriculado;
import model.Plano;
import model.Turma;
import pagecontroller.JsfUtil;

/**
 *
 * @author Edilson Fernandes da Costa
 * @version 1.0
 */
public class TurmaController extends Controller {

    public TurmaController() {
        if (JsfUtil.getObjectFromSession("TurmaJpaController") == null) {
            jpaController = new TurmaJpaController();
        } else {
            jpaController = (TurmaJpaController) JsfUtil.getObjectFromSession("TurmaJpaController");
        }
    }
    private Turma turma = null;
    private Turma turmaAux = null;
    private TurmaJpaController jpaController = null;
    private List<Turma> turmas = null;
    private DisciplinaProfessor disciplinaProfessor;
    private Plano plano;
    private String searchEmenta = "";
    private ConteudoDaEmenta conteudoDaEmenta;
    private List<ConteudoDaEmenta> conteudoDaEmentas;
    private List<Aluno> alunosMatriculados;
    private List<Ementa> ementas;
    private List<Turma> turmasProfessor;
    private int indexConteudoDaEmenta = 0;

    public void clear() {
        turma = null;
        plano = null;
        conteudoDaEmenta = null;
        conteudoDaEmentas = null;
        disciplinaProfessor = null;
    }

    public String setPageTurmaCad() {

        if (getDisciplinaProfessorController().getDisciplinaProfessorLogado() == null || getDisciplinaProfessorController().getDisciplinaProfessorLogado().size() == 0) {
            JsfUtil.addErrorMessage("Cadastre disciplinas primeiro");
            getDisciplinaProfessorController().setPageDisciplinaCad();
            return "refreshPage";
        }
        clear();
        getPageManager().setPageTurmaCad();
        return "refreshPage";
    }

    public DisciplinaProfessor getDisciplinaProfessor() {
        if (disciplinaProfessor == null) {
            disciplinaProfessor = getDisciplinaProfessorController().getDisciplinaProfessorAux();
        }
        if (disciplinaProfessor == null) {
            List<DisciplinaProfessor> dps = getDisciplinaProfessorController().getDisciplinaProfessorLogado();
            if (dps != null) {
                disciplinaProfessor = dps.get(0);
            }

        }
        if (disciplinaProfessor == null) {
            disciplinaProfessor = new DisciplinaProfessor();
        }
        return disciplinaProfessor;
    }

    public void setDisciplinaProfessor(DisciplinaProfessor disciplinaProfessor) {
        this.disciplinaProfessor = disciplinaProfessor;
    }

    public String persiste() {
        if (turma.getId() == null) {
            return create();
        } else {
            return update();
        }
    }

    public String update() {
        try {

            jpaController.edit(turma);

            getPlanoController().getJpaController().edit(plano);

            List<ConteudoDaEmenta> conteudoDaEmentasBanco = new ArrayList<ConteudoDaEmenta>();

            for (Conteudo c : plano.getConteudos()) {
                conteudoDaEmentasBanco.addAll(c.getConteudoDaEmentas());
            }

            for (ConteudoDaEmenta cdeBanco : conteudoDaEmentasBanco) {
                if (!getConteudoDaEmentas().contains(cdeBanco)) {
                    getConteudoDaEmentaController().getJpaController().destroy(cdeBanco.getId());
                }
            }

            for (ConteudoDaEmenta cde : conteudoDaEmentas) {
                if (cde.getId() == null) {
                    cde.getConteudo().setPlano(plano);
                    getConteudoController().getJpaController().create(cde.getConteudo());
                    getConteudoDaEmentaController().getJpaController().create(cde);
                } else {
                    getConteudoDaEmentaController().getJpaController().edit(cde);
                    getConteudoController().getJpaController().edit(cde.getConteudo());
                }
            }

            turmaAux = turma;


            jpaController.edit(this.turma);
            turmaAux = turma;
            this.turma = null;
            clear();
            JsfUtil.addSuccessMessage("Turma Atualizado com Sucesso");
            getPageManager().setPageTurmaRelat();
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(TurmaController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(TurmaController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "refreshPage";
    }

    public String create() {

//        PlanoJpaController planoJpaController = (PlanoJpaController) JsfUtil.getObjectFromSession("PlanoJpaController");
//        if (planoJpaController == null) {
//            planoJpaController = new PlanoJpaController();
//        }
//
//        ConteudoJpaController conteudoJpaController = (ConteudoJpaController) JsfUtil.getObjectFromSession("ConteudoJpaController");
//        if (conteudoJpaController == null) {
//            conteudoJpaController = new ConteudoJpaController();
//        }
//
//        ConteudoDaEmentaJpaController conteudoDaEmentaJpaController = (ConteudoDaEmentaJpaController) JsfUtil.getObjectFromSession("ConteudoDaEmentaJpaController");
//        if (conteudoDaEmentaJpaController == null) {
//            conteudoDaEmentaJpaController = new ConteudoDaEmentaJpaController();
//        }


        try {

            jpaController.create(turma);
            
            plano.setTurma(turma);
            turma.setPlano(plano);
            
            getPlanoController().getJpaController().create(plano);

            if(plano.getConteudos() == null){
                plano.setConteudos(new ArrayList<Conteudo>());
            }
            
            for (ConteudoDaEmenta cde : conteudoDaEmentas) {
                cde.getConteudo().setPlano(plano);
                plano.getConteudos().add(cde.getConteudo());
                getConteudoController().getJpaController().create(cde.getConteudo());
                getConteudoDaEmentaController().getJpaController().create(cde);
            }
            
            turmaAux = turma;
            clear();
            JsfUtil.addSuccessMessage("Turma cadastrado com sucesso.");
            getPageManager().setPageTurmaRelat();
        } catch (Exception e) {
            JsfUtil.ensureAddErrorMessage(e, "Ocorreu um erro na percistencia dos dados.");
            return null;
        }
        return "refreshPage";
    }

    public String edit() {
        turmaAux = (Turma) JsfUtil.getObjectFromRequestParameter("turmaTemp");
        turma = getTurmaAux();

//        this.turma = getTurmaController().getJpaController().findTurma(turmaTemp.getId());
//
//        this.setPlano(turmaTemp.getPlano());
//
//        this.setConteudoDaEmentas(new ArrayList<ConteudoDaEmenta>());
//        for (Conteudo c : plano.getConteudos()) {
//            this.getConteudoDaEmentas().addAll(c.getConteudoDaEmentas());
//        }





        getPageManager().setPageTurmaCad();
        return "refreshPage";
    }

    public String destroy() {
//        Turma turmaTemp = (Turma) JsfUtil.getObjectFromRequestParameter("turma");
        Turma turmaTemp = turmaAux;
        try {
            
            for(Matriculado m:turmaTemp.getMatriculados()){
                getMatriculadoController().getJpaController().destroy(m.getId());
            }
            
            
            
            jpaController.destroy(turmaTemp.getId());
            JsfUtil.addSuccessMessage("Turma removido com sucesso.");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(TurmaController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public String destroyButton() {
        Turma turmaTemp = turmaAux;
        try {
            jpaController.destroy(turmaTemp.getId());
            JsfUtil.addSuccessMessage("Turma removida com sucesso.");
            turmaAux = null;

        } catch (NonexistentEntityException ex) {
            Logger.getLogger(AlunoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public String load() {
        turmaAux = (Turma) JsfUtil.getObjectFromRequestParameter("turmaTemp");
        getPageManager().setPageTurmaRelat();
        return "refreshPage";
    }

    public String editButton() {
        this.turma = turmaAux;
        getPageManager().setPageTurmaCad();

        return "refreshPage";
    }

    public Turma getTurma() {
        if (turma == null) {
            turma = new Turma();
            turma.setDisciplinaProfessor(disciplinaProfessor);
            plano = new Plano();
        }
        return turma;
    }

    public List<Turma> getTurmas() {
        this.turmas = jpaController.findTurmaEntities();
        return this.turmas;
    }

    public List<Turma> getTurmas(DisciplinaProfessor disciplinaProfessor) {
        this.turmas = jpaController.findTurmaEntities(disciplinaProfessor);
        return this.turmas;
    }

    public TurmaJpaController getJpaController() {
        return jpaController;
    }

    public Turma getTurmaAux() {
        turmaAux.getPlano();
//        turmaAux.getPlano().getConteudos().size();
        conteudoDaEmentas = new ArrayList<ConteudoDaEmenta>();
    
//           plano =  getPlanoController().getPlanoDaTurma(turmaAux);
           plano = turmaAux.getPlano();
           
//        plano = turmaAux.getPlano();
        turmaAux.setPlano(plano);
        ;
        for (Conteudo c : getConteudoController().getConteudos(plano)) {
            conteudoDaEmentas.addAll(getConteudoDaEmentaController().getConteudoDaEmentas(c));
        }
        return turmaAux;
    }

    public Plano getPlano() {
        return plano;
    }

    public void setPlano(Plano plano) {
        this.plano = plano;
    }

    public String getSearchEmenta() {
        return searchEmenta;
    }

    public void setSearchEmenta(String searchEmenta) {
        this.searchEmenta = searchEmenta;
    }

    public ConteudoDaEmenta getConteudoDaEmenta() {
        if (conteudoDaEmenta == null) {
            conteudoDaEmenta = new ConteudoDaEmenta();
            conteudoDaEmenta.setConteudo(new Conteudo());
            conteudoDaEmenta.setEmenta(new Ementa());
        }
        return conteudoDaEmenta;
    }

    public void setConteudoDaEmenta(ConteudoDaEmenta conteudoDaEmenta) {
        this.conteudoDaEmenta = conteudoDaEmenta;
    }

    public List<ConteudoDaEmenta> getConteudoDaEmentas() {
        if (conteudoDaEmentas == null) {
            conteudoDaEmentas = new ArrayList<ConteudoDaEmenta>();
        }
        return conteudoDaEmentas;
    }

    public void setConteudoDaEmentas(List<ConteudoDaEmenta> conteudoDaEmentas) {
        this.conteudoDaEmentas = conteudoDaEmentas;
    }

    public String addConteudoDaEmenta() {
        if (indexConteudoDaEmenta == 0) {
            conteudoDaEmentas.add(conteudoDaEmenta);
        }
        getPageManager().setModalInvisible();
        conteudoDaEmenta = null;
        indexConteudoDaEmenta = 0;
        return "refreshPage";
    }

    public String editConteudoDaEmenta() {
        conteudoDaEmenta = (ConteudoDaEmenta) JsfUtil.getObjectFromRequestParameter("conteudoDaEmentaTemp");
        indexConteudoDaEmenta = getConteudoDaEmentas().indexOf(conteudoDaEmenta) + 1;
        getPageManager().setModalConteudoCad();
        return "refreshPage";
    }

    public String removeConteudoDaEmenta() {
        ConteudoDaEmenta cde = (ConteudoDaEmenta) JsfUtil.getObjectFromRequestParameter("conteudoDaEmentaTemp");
        conteudoDaEmentas.remove(cde);
        return "refreshPage";
    }

    public String disciplinaSave() {
        return "refreshPage";
    }

    public List<Aluno> getAlunosMatriculados() {
        alunosMatriculados = new ArrayList<Aluno>();
        List<Matriculado> matriculados = getMatriculadoController().getMatriculados(getTurmaAux());
        for (Matriculado m : matriculados) {
            m = getMatriculadoController().getJpaController().findMatriculado(m.getId());
//            alunosMatriculados.add(getAlunoController().getJpaController().findAluno(m.getAluno().getId()));
            alunosMatriculados.add(m.getAluno());
        }
        return alunosMatriculados;
    }

    public void setAlunosMatriculados(List<Aluno> alunosMatriculados) {
        this.alunosMatriculados = alunosMatriculados;
    }

    public List<Ementa> getEmentas() {
        ementas = getEmentaController().finEmentas(getDisciplinaProfessor());
        return ementas;
    }

    public void setEmentas(List<Ementa> ementas) {
        this.ementas = ementas;
    }

    public List<Turma> getTurmasProfessor() {
        turmasProfessor = new ArrayList<Turma>();
        for (DisciplinaProfessor dp : getRenewDisciplinaProfessorController().getDisciplinaProfessorLogado()) {
            turmasProfessor.addAll(jpaController.findTurmaEntities(dp));
        }
        return turmasProfessor;
    }

    public void setTurmasProfessor(List<Turma> turmasProfessor) {
        this.turmasProfessor = turmasProfessor;
    }
}